// 完成一个深拷贝：
// 深拷贝将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,
// 且修改新对象不会影响原对象

function deepClone<T extends Object>(
  target: any,
  map: WeakMap<T, T> = new WeakMap()
) {
  // 参数判断WeakMap是否存在，不存在的话新建一个
  // 判断给定目标是否是对象，如果不是对象直接返回即可
  if (typeof target === "object") {
    let cloneObject = Array.isArray(target) ? [] : Object.create(null); // 兼容数组
    if (map.get(target)) {
      return map.get(target); // 防止循环引用，如果之前存储过映射关系就直接返回
    }
    map.set(target, cloneObject); // 存储进另一块内存
    for (let key in target) {
      cloneObject[key] = deepClone(target[key], map); // 解决深层引用，递归对象
    }
    return cloneObject;
  } else {
    return target;
  }
}




// 测试用例---->包含基础数据类型、数组、对象、循环引用
const obj1: any = {
  field1: 1,
  field2: undefined,
  field3: {
    child: "child",
  },
  field4: [2, 4, 8],
};
obj1.obj1 = obj1;// 检测循环引用
let obj2 = deepClone(obj1);
console.log(obj2);
